1 : <?php
2 :
3 :
4 : /*--------------------------------------------------------------------------+
5 : This file is part of eStudy.
6 : admin/classes/class.XmlImport.inc.php
7 : - Modulgruppe: Portal-Administration
8 : - Beschreibung: Dieses Modul behandelt "XML-Import"
9 : - Version: 0.1, 24/07/07
10 : - Autor(en): Christian Ketter <christian.ketter@mni.fh-giessen.de>
11 : +---------------------------------------------------------------------------+
12 : This program is free software; you can redistribute it and/or
13 : modify it under the terms of the GNU General Public License
14 : as published by the Free Software Foundation; either version 2
15 : of the License, or any later version.
16 : +---------------------------------------------------------------------------+
17 : This program is distributed in the hope that it will be useful,
18 : but WITHOUT ANY WARRANTY; without even the implied warranty of
19 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 : GNU General Public License for more details.
21 : You should have received a copy of the GNU General Public License
22 : along with this program; if not, write to the Free Software
23 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 : +--------------------------------------------------------------------------*/
25 : /**
26 : * In dieser Datei wird die Klasse "XmlImport" implementiert.
27 : * @package eStudy.admin
28 : * * @author Christian Ketter <christian.ketter@mni.fh-giessen.de>
29 : * @version 0.2, 12/03/08
30 : */
31 :
32 : /** relativer Pfad zum Root des Portals */
33 : if (!defined("PATH_TO_ROOT"))
34 : define("PATH_TO_ROOT", "../../");
35 :
36 : require_once ("class.XmlFile.inc.php");
37 : require_once (PATH_TO_ROOT . "user/classes/class.usertools.inc.php"); //Tools-Klasse
38 :
39 : class XmlImport {
40 :
41 : private $uploaddir;
42 :
43 : /* Ab PHP 5 */
44 : function __construct() {
45 0 : global $settings;
46 :
47 : /* Konstruktion des Uploadverzeichnisses als absoluten Pfad (, da die ZIP-Funktionen im (PHP) module mode
48 : * einen absoluten Pfad erwarten)
49 : */
50 :
51 0 : if (!is_dir(PATH_TO_ROOT . $settings["upload_path"] . "xmlImport/"))
52 0 : @ mkdir(PATH_TO_ROOT . $settings["upload_path"] . "xmlImport/", 0777);
53 :
54 0 : $this->uploaddir = realpath(PATH_TO_ROOT . $settings["upload_path"] . "xmlImport");
55 0 : $this->uploaddir .= "/"; // realpath wuerde letztes "/" verschlucken
56 :
57 0 : }
58 :
59 : /* Für PHP 4 */
60 : function XmlImport() {
61 0 : $this->__construct();
62 0 : }
63 :
64 : function save_file($datei) {
65 0 : if (!move_uploaded_file($datei['tmp_name'], $this->uploaddir . $datei['name']))
66 0 : return false;
67 :
68 0 : if (!$this->unzip_file($this->uploaddir . $datei['name']))
69 0 : return false;
70 0 : return true;
71 : }
72 :
73 : function get_modulinfos_from_temp() {
74 0 : $moduls = array ();
75 :
76 0 : if ($ordner = opendir($this->uploaddir)) {
77 0 : while (false !== ($file = readdir($ordner))) {
78 0 : if (true === $this->validate_file($file)) {
79 0 : array_push($moduls, new XmlFile($this->uploaddir . $file));
80 0 : }
81 0 : }
82 :
83 0 : return $moduls;
84 : closedir($ordner);
85 : }
86 0 : }
87 :
88 :
89 : /* Es werden nur die Module zurückgegegeben, die bei mehreren auftretenden Modulkürzel die höchste ID haben, (also die Aktuellsten) */
90 : function get_latest_modulinfos_from_db() {
91 0 : global $db, $EZSQL_ERROR;
92 0 : $moduls = array ();
93 :
94 : // Die höchste ID zuerst...
95 0 : $query = "SELECT * FROM modulbeschreibungen ORDER BY 'modul_id' DESC ";
96 0 : $errorCount = count($EZSQL_ERROR);
97 0 : $sql = $db->get_results($query, ARRAY_N);
98 0 : $cnt = 0;
99 0 : foreach ($sql as $modul) {
100 0 : $msc_used = false;
101 : // Prüfen, ob das Modulkürzel (mit der höchsten ID) bereits erfasst wurde
102 0 : foreach ($moduls as $modul_inner) {
103 0 : if ($modul_inner->modulkuerzel == $modul[2])
104 0 : $msc_used = true;
105 0 : }
106 : // Falls ja, überspringe aktuellen Schleifendurchlauf
107 : if ($msc_used)
108 0 : continue;
109 :
110 0 : array_push($moduls, new XmlFile());
111 0 : $moduls[$cnt]->modulkuerzel = $modul[2];
112 0 : $moduls[$cnt++]->modultitel = $modul[3];
113 :
114 0 : }
115 0 : if (count($EZSQL_ERROR) > $errorCount)
116 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
117 :
118 : /* /* Vertauscht die Elemente hinten und vorne, damit die Modulkürzel eher absteigend sortiert sind
119 : return array_reverse($moduls); */
120 :
121 0 : return $moduls;
122 : }
123 :
124 : static function get_modul_by_modulID($modul_ID) {
125 0 : global $db, $EZSQL_ERROR;
126 0 : $modul_inhalt = new XmlFile();
127 :
128 0 : $query = "SELECT * from modulbeschreibungen WHERE modul_ID = '$modul_ID'";
129 :
130 0 : $errorCount = count($EZSQL_ERROR);
131 0 : $sql = $db->get_results($query, ARRAY_N);
132 :
133 0 : if ($sql != FALSE){
134 0 : foreach ($sql as $modul){
135 0 : $modul_inhalt->modul_ID = $modul[0];
136 0 : $modul_inhalt->studiengang = $modul[1];
137 0 : $modul_inhalt->modulkuerzel = $modul[2];
138 0 : $modul_inhalt->modultitel = $modul[3];
139 0 : $modul_inhalt->lernziele = $modul[4];
140 0 : $modul_inhalt->lerninhalt = $modul[5];
141 0 : $modul_inhalt->modultyp = $modul[6];
142 0 : $modul_inhalt->lehrformen = $modul[7];
143 0 : $modul_inhalt->literatur = $modul[8];
144 0 : $modul_inhalt->creditpoints = $modul[9];
145 0 : $modul_inhalt->voraussetzungen = $modul[10];
146 0 : $modul_inhalt->kurzbeschreibung = $modul[11];
147 0 : }
148 0 : }
149 : else{
150 : // Wenn der Kurs unter der ID nicht gefunden wird, wird -1 für die modul_id zurückgegeben
151 0 : $modul_inhalt->modul_ID = -1;
152 0 : return $modul_inhalt;
153 : }
154 0 : if (count($EZSQL_ERROR) > $errorCount)
155 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
156 :
157 0 : return $modul_inhalt;
158 : }
159 :
160 : function import_all() {
161 0 : $moduls = $this->get_modulinfos_from_temp();
162 :
163 0 : foreach ($moduls as $modul)
164 0 : $this->insert_in_db($modul);
165 0 : $this->clear_temp();
166 0 : }
167 :
168 : function import_sel($sel_moduls) {
169 0 : $moduls = $this->get_modulinfos_from_temp();
170 :
171 0 : if ($sel_moduls === NULL)
172 0 : return; // Falls nichts ausgewaehlt wurde, nicht importieren
173 :
174 0 : foreach ($moduls as $modul) {
175 0 : if (in_array($modul->modulkuerzel, $sel_moduls))
176 0 : $this->insert_in_db($modul);
177 0 : }
178 0 : $this->clear_temp();
179 0 : }
180 :
181 : static function get_latest_ID_by_MSC($modulShortCut) {
182 0 : global $db, $EZSQL_ERROR;
183 :
184 0 : $query = "SELECT modul_id FROM modulbeschreibungen WHERE modulkuerzel=\"" . $modulShortCut . "\"";
185 0 : $errorCount = count($EZSQL_ERROR);
186 0 : $sql = $db->get_results($query, ARRAY_N);
187 0 : if (count($EZSQL_ERROR) > $errorCount)
188 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
189 0 : if (count($sql) < 1)
190 0 : return -1;
191 :
192 0 : return $sql[count($sql) - 1][0]; //Letzte ID wird zurück gegeben
193 : }
194 :
195 : static function get_modul_id($modul) {
196 0 : global $db, $EZSQL_ERROR;
197 :
198 0 : $query = "SELECT modul_id FROM modulbeschreibungen WHERE modulkuerzel=\"" . $modul->modulkuerzel . "\"";
199 0 : $errorCount = count($EZSQL_ERROR);
200 0 : $row = $db->get_row($query, ARRAY_N);
201 0 : if (count($EZSQL_ERROR) > $errorCount)
202 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
203 0 : if (count($row) < 1)
204 0 : return -1;
205 0 : return $row[0];
206 :
207 : }
208 :
209 : static function get_unused_moduls() {
210 0 : global $db, $EZSQL_ERROR;
211 0 : $moduls = array ();
212 :
213 : /* Module, die referenzeiert werden*/
214 : $query = "SELECT modul_id
215 : FROM modulbeschreibungen INNER JOIN courses
216 0 : ON (modul_ID = modulbeschreibung_ID)";
217 0 : $errorCount = count($EZSQL_ERROR);
218 0 : $sql = $db->get_results($query, ARRAY_N);
219 0 : $cnt = 0;
220 0 : if ( $sql !== NULL ) {
221 0 : foreach ($sql as $modul) {
222 0 : array_push($moduls, new XmlFile());
223 0 : $moduls[$cnt++]->modul_ID = $modul[0];
224 0 : }
225 0 : }
226 :
227 : /* Module, die NICHT referenziert werden*/
228 : $query = "SELECT modul_id, studiengang, modulkuerzel, modultitel
229 : FROM modulbeschreibungen
230 0 : WHERE ";
231 0 : foreach ($moduls as $modul)
232 0 : $query .= "(modul_id != '" . $modul->modul_ID . "') AND ";
233 0 : $query = substr($query, 0, strlen($query) - 5); //Letztes "AND" entfernen
234 0 : $errorCount = count($EZSQL_ERROR);
235 0 : $sql = $db->get_results($query, ARRAY_N);
236 0 : unset ($moduls);
237 0 : $moduls = array (); // Array neu erzeugen
238 0 : $cnt = 0;
239 0 : if ( $sql !== NULL ) {
240 0 : foreach ($sql as $modul) {
241 0 : array_push($moduls, new XmlFile());
242 0 : $moduls[$cnt]->modul_ID = $modul[0];
243 0 : $moduls[$cnt]->studiengang = $modul[1];
244 0 : $moduls[$cnt]->modulkuerzel = $modul[2];
245 0 : $moduls[$cnt++]->modultitel = $modul[3];
246 0 : }
247 0 : }
248 0 : if (count($EZSQL_ERROR) > $errorCount)
249 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
250 :
251 0 : return $moduls;
252 : }
253 :
254 : static function del_unused_moduls() {
255 0 : global $db, $EZSQL_ERROR;
256 0 : $moduls = XmlImport :: get_unused_moduls();
257 :
258 : //Alle ungebrauchten Module loeschen
259 0 : foreach ($moduls as $modul)
260 0 : XmlImport :: del_modul($modul->modul_ID);
261 0 : }
262 :
263 : static function del_modul($modul_id) {
264 0 : global $db, $EZSQL_ERROR;
265 :
266 0 : $query = "DELETE
267 : FROM modulbeschreibungen
268 0 : WHERE modul_id = \"$modul_id\"";
269 0 : $errorCount = count($EZSQL_ERROR);
270 0 : $sql = $db->query($query);
271 0 : if (count($EZSQL_ERROR) > $errorCount)
272 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
273 :
274 0 : }
275 :
276 : private function unzip_file($dateipfad) {
277 0 : $ziel_ordner = $this->uploaddir;
278 :
279 : //ZIP-Datei öffnen und in $ziel_ordner extrahieren
280 0 : $zip = zip_open($dateipfad);
281 0 : if (!is_resource($zip))
282 0 : return false;
283 :
284 0 : if ($zip) {
285 0 : while ($zip_entry = zip_read($zip)) {
286 0 : $file_name = zip_entry_name($zip_entry);
287 0 : $file_size = zip_entry_filesize($zip_entry);
288 0 : $comp_meth = zip_entry_compressionmethod($zip_entry);
289 :
290 0 : if (zip_entry_open($zip, $zip_entry, 'rb')) {
291 0 : $buffer = zip_entry_read($zip_entry, $file_size);
292 :
293 0 : if (preg_match('/\/$/', $file_name) && ($comp_meth == 'stored')) {
294 0 : if (!is_dir($ziel_ordner . $file_name))
295 0 : @ mkdir($ziel_ordner . $file_name, 0777);
296 0 : } else {
297 0 : $fp = fopen($ziel_ordner . $file_name, 'wb');
298 0 : fwrite($fp, $buffer);
299 0 : fclose($fp);
300 : }
301 :
302 0 : zip_entry_close($zip_entry);
303 0 : }
304 0 : }
305 :
306 0 : zip_close($zip);
307 0 : unlink($dateipfad); //Löschen der ZIP-Datei
308 0 : } else
309 0 : return false;
310 :
311 0 : return true;
312 : }
313 :
314 : private function validate_file($datei) {
315 0 : if ((StrToLower(substr($datei, strlen($datei) - 3, 3)) != "xml") || (StrToLower(substr($datei, 0, 8)) == "dozenten"))
316 0 : return false;
317 0 : return true;
318 : }
319 :
320 : private function insert_in_db($modul) {
321 0 : global $db, $EZSQL_ERROR;
322 :
323 0 : $errorCount = count($EZSQL_ERROR);
324 : // if ($this->get_modul_id($modul) === -1){
325 : $query = "INSERT INTO modulbeschreibungen (studiengang,modulkuerzel,modultitel,lernziele,lerninhalt,modultyp,lehrformen,literatur,creditpoints,voraussetzungen,kurzbeschreibung)" .
326 0 : "values (\"" . Data :: toMysql(utf8_decode($modul->studiengang)) . "\",\"" . Data :: toMysql(utf8_decode($modul->modulkuerzel)) . "\",\"" . Data :: toMysql(utf8_decode($modul->modultitel)) . "\",\"" . Data :: toMysql(utf8_decode($modul->lernziele)) . "\",\"" . Data :: toMysql(utf8_decode($modul->lerninhalt)) . "\",\"" . Data :: toMysql(utf8_decode($modul->modultyp)) . "\",\"" . Data :: toMysql(utf8_decode($modul->lehrformen)) . "\",\"" . Data :: toMysql(utf8_decode($modul->literatur)) . "\"," . Data :: toMysql(utf8_decode($modul->creditpoints)) . ",\"" . Data :: toMysql(utf8_decode($modul->voraussetzungen)) . "\", \"" . Data :: toMysql(utf8_decode($modul->kurzbeschreibung)) . "\")";
327 0 : $sql = $db->query($query);
328 : // }
329 : /* if else Struktur nur notwendig, wenn alte Modulbeschreibungen eines Modulkürzels durch eine neue Modulbescheibung ersetzt werden sollen
330 : * else{
331 : $modul_id = $this->get_modul_id($modul);
332 : $query = "DELETE FROM modulbeschreibungen WHERE modulkuerzel = \"$modul->modulkuerzel\"";
333 : $sql = $db->query($query);
334 : $query = "INSERT INTO modulbeschreibungen (modul_id,studiengang,modulkuerzel,modultitel,lernziele,lerninhalt,modultyp,lehrformen,literatur,creditpoints,voraussetzungen,kurzbeschreibung)" .
335 : "values (".$modul_id.",\"".Data::toMysql(utf8_decode($modul->studiengang))."\",\"".Data::toMysql(utf8_decode($modul->modulkuerzel))."\",\"".Data::toMysql(utf8_decode($modul->modultitel))."\",\"".Data::toMysql(utf8_decode($modul->lernziele))."\",\"".Data::toMysql(utf8_decode($modul->lerninhalt))."\",\"".Data::toMysql(utf8_decode($modul->modultyp))."\",\"".Data::toMysql(utf8_decode($modul->lehrformen))."\",\"".Data::toMysql(utf8_decode($modul->literatur))."\",".Data::toMysql(utf8_decode($modul->creditpoints)).",\"".Data::toMysql(utf8_decode($modul->voraussetzungen))."\", \"".Data::toMysql(utf8_decode($modul->kurzbeschreibung))."\")";
336 : $sql = $db->query($query);
337 : }*/
338 0 : if (count($EZSQL_ERROR) > $errorCount)
339 0 : Output :: errorMessage("Fataler Fehler beim Datenbankzugriff aufgetreten!", 1, false, true);
340 0 : }
341 :
342 : private function clear_temp() {
343 0 : $temp = opendir($this->uploaddir);
344 0 : while ($filename = readdir($temp)) {
345 0 : if ($filename != "." && $filename != ".." && $filename != "CVS")
346 0 : unlink($this->uploaddir . $filename);
347 0 : }
348 0 : closedir($temp);
349 0 : }
350 : }
351 : ?>
|